#pragma once

#include "../engine.h"

namespace burn {

class GDynamicEngine : public GEngine {
protected:
  CStatus setup(const GSortedGElementPtrSet &elements) override;

  CStatus run() override;

  CStatus afterRunCheck() override;

  /**
   * 动态图运行
   * @param
   * @return
   */
  CVoid asyncRun();

  /**
   * 动态图运行前重置
   * @param
   * @return
   */
  CStatus beforeRun();

  /**
   * element 运行element
   * @param element
   * @return
   */
  CStatus process(GElementPtr element);

  /**
   * element 运行完成处理
   * @param element
   * @return
   */
  CVoid afterElementRun(GElementPtr element);

  /**
   * 动态图运行等待
   * @param
   * @return
   */
  CStatus wait();

private:
  GElementPtrArr total_element_arr_; // pipeline中所有的元素信息集合
  GElementPtrArr front_element_arr_; // 没有依赖的元素信息
  CSize total_end_size_ = 0;         // 图结束节点数量
  CSize finished_end_size_ = 0;      // 执行结束节点数量
  std::atomic<CSize>
      run_element_size_; // 执行元素的个数，用于后期校验。这里和静态不一样，需要加atomic
  CStatus cur_status_;   // 当前全局的状态信息

  std::mutex lock_;
  std::condition_variable cv_;
};

} // namespace burn